package org.jeecg.modules.wangyue.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 日期时间工具
 */
public class DateUtil {

    /**
     * 获取当前时间(Date类型)
     * @param format    时间格式(例如：yyyy-MM-dd HH:mm:ss)
     * @return
     */
    public static Date getTime(String format){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            return sdf.parse(sdf.format(new Date()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 获取当前时间(字符串类型)
     * @param format    时间格式(例如：yyyy-MM-dd HH:mm:ss)
     * @return
     */
    public static String getTimeStr(String format){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date());
    }


    /**
     * 获取距离当前时间millis毫秒的时间(字符串类型)
     * @param format    时间格式(例如：yyyy-MM-dd HH:mm:ss)
     * @param millis    距离当前时间的毫秒(正为未来，负为过去)
     * @return
     */
    public static String getTimeStrToMillis(String format, Long millis){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date(System.currentTimeMillis() + millis));
    }


    /**
     * 将Date类型转为format格式的字符串类型
     *
     * @param format    时间格式
     * @param date      日期
     * @return
     */
    public static String getTimeStrByDate(String format, Date date){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 将字符串类型转为format格式的Date类型
     *
     * @param format        时间格式
     * @param dateStr       日期字符串
     * @return
     */
    public static Date getTimeByStr(String format, String dateStr){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            return sdf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 根据 当前月份 来获得某月的第一天(年月日)
     * @param format 格式(例如 yyyy-MM-dd)
     * @param num 与当月相差的月数 （0表示本月，正数为未来，负数为过去）
     * @return
     */
    public static String getFirstDayOfmonth(String format, int num){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MONTH, num);
        c.set(Calendar.DAY_OF_MONTH, 1);//该月的第一天
        return sdf.format(c.getTime());
    }

    /**
     * 根据 当前月份 来获得某月的最后一天(年月日)
     * @param format 格式(例如 yyyy-MM-dd)
     * @param num 与当月相差的月数 （0表示本月，正数为未来，负数为过去）
     * @return
     */
    public static String getLastDayOfmonth(String format, int num){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Calendar c = Calendar.getInstance();
        c.add(Calendar.MONTH, num);
        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); //该月的最后一天
        return sdf.format(c.getTime());
    }


    /**
     * 获取某月的每一天的年月日字符串
     *
     * @param date   参数格式为yyyy-MM-dd HH:mm:ss ， 可以不传日、时、分、秒， 至少要传yyyy-MM
     * @return      返回的时间格式为yyyy-MM-dd
     */
    public static List<String> getEveryDayOfMonth(String date){
        List<String> dayList = new ArrayList<>();
        try{
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(sdf.parse(date));
            int day = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //获取该月有多少天
            Date month = sdf.parse(date);
            for(int i=1;i <= day;i++){
                if(i < 10){
                    dayList.add(sdf.format(month) + "-0" + i); //例如：2023-08-02
                }else {
                    dayList.add(sdf.format(month) + "-" + i); //例如：2023-08-21
                }
            }
            return dayList;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }




    public static void main(String[] args) {
        System.out.println("getTime:" + DateUtil.getTime("yyyy-MM-dd HH:mm:ss"));
        System.out.println("getTimeStr:" + DateUtil.getTimeStr("yyyy-MM-dd HH:mm:ss"));
        System.out.println("getTimeStrToMillis:" + DateUtil.getTimeStrToMillis("yyyy-MM-dd HH:mm:ss", 1000*60*2L));

        System.out.println("getFirstDayOfmonth:" + getFirstDayOfmonth("yyyy-MM-dd", 0));
        System.out.println("getLastDayOfmonth:" + getLastDayOfmonth("yyyy-MM-dd", 0));

        System.out.println("getTimeByStr:" + getTimeByStr("yyyy-MM-dd HH:mm:ss", "2023-08-08 12:30"));
    }


}
